Adds an open xenstore connection function which tries to use the xenbus
authorStefano Stabellini <sstabellini@xensource.com>
Mon, 13 Dec 2010 17:15:31 +0000 (17:15 +0000)
committerStefano Stabellini <sstabellini@xensource.com>
Mon, 13 Dec 2010 17:15:31 +0000 (17:15 +0000)
interface (xs_domain_open) when the socket interface (xs_daemon_opn)
fails.

Signed-off-by: Mihir Nanavati <mihirn@cs.ubc.ca>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
committer: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

tools/xenstore/xs.c
tools/xenstore/xs.h

index 112feec8a50ef7789b762cf8d29cfdb9b012a79f..f3532b03c15d4ab5e59598d5fcd20e190d470820 100644 (file)
@@ -182,12 +182,15 @@ error:
        return -1;
 }
 
-static int get_dev(const char *connect_to)
+static int get_dev(const char *connect_to, unsigned long flags)
 {
-       return open(connect_to, O_RDWR);
+       if (flags & XS_OPEN_READONLY)
+               return open(connect_to, O_RDONLY);
+       else
+               return open(connect_to, O_RDWR);
 }
 
-static struct xs_handle *get_handle(const char *connect_to)
+static struct xs_handle *get_handle(const char *connect_to, unsigned long flags)
 {
        struct stat buf;
        struct xs_handle *h = NULL;
@@ -199,7 +202,7 @@ static struct xs_handle *get_handle(const char *connect_to)
        if (S_ISSOCK(buf.st_mode))
                fd = get_socket(connect_to);
        else
-               fd = get_dev(connect_to);
+               fd = get_dev(connect_to, flags);
 
        if (fd == -1)
                return NULL;
@@ -237,17 +240,32 @@ static struct xs_handle *get_handle(const char *connect_to)
 
 struct xs_handle *xs_daemon_open(void)
 {
-       return get_handle(xs_daemon_socket());
+       return xs_open(0);
 }
 
 struct xs_handle *xs_daemon_open_readonly(void)
 {
-       return get_handle(xs_daemon_socket_ro());
+       return xs_open(XS_OPEN_READONLY);
 }
 
 struct xs_handle *xs_domain_open(void)
 {
-       return get_handle(xs_domain_dev());
+       return xs_open(0);
+}
+
+struct xs_handle *xs_open(unsigned long flags)
+{
+       struct xs_handle *xsh = NULL;
+
+       if (flags & XS_OPEN_READONLY)
+               xsh = get_handle(xs_daemon_socket_ro(), flags);
+       else
+               xsh = get_handle(xs_daemon_socket(), flags);
+
+       if (!xsh)
+               xsh = get_handle(xs_domain_dev(), flags);
+
+       return xsh;
 }
 
 static void close_free_msgs(struct xs_handle *h) {
@@ -303,6 +321,12 @@ void xs_daemon_close(struct xs_handle *h)
         close_fds_free(h);
 }
 
+void xs_close(struct xs_handle* xsh)
+{
+       if (xsh)
+               xs_daemon_close(xsh);
+}
+
 static bool read_all(int fd, void *data, unsigned int len)
 {
        while (len) {
index 4806f1e24042b6640c41ffa3a3930b420f45d0f3..1e28849eac167d000d8194dfde6cf458e970ee01 100644 (file)
@@ -24,6 +24,8 @@
 
 #define XBT_NULL 0
 
+#define XS_OPEN_READONLY       1<<0
+
 struct xs_handle;
 typedef uint32_t xs_transaction_t;
 
@@ -34,18 +36,34 @@ typedef uint32_t xs_transaction_t;
 
 /* On failure, these routines set errno. */
 
+/* Open a connection to the xs daemon.
+ * Attempts to make a connection over the socket interface, 
+ * and if it fails, then over the  xenbus interface.
+ * Mode 0 specifies read-write access, XS_OPEN_READONLY for
+ * read-only access.
+ * Returns a handle or NULL.
+ */
+struct xs_handle *xs_open(unsigned long flags);
+
+/* Close the connection to the xs daemon. */
+void xs_close(struct xs_handle *xsh);
+
 /* Connect to the xs daemon.
  * Returns a handle or NULL.
+ * Deprecated, please use xs_open(0) instead
  */
 struct xs_handle *xs_daemon_open(void);
 struct xs_handle *xs_domain_open(void);
 
 /* Connect to the xs daemon (readonly for non-root clients).
  * Returns a handle or NULL.
+ * Deprecated, please use xs_open(XS_OPEN_READONLY) instead
  */
 struct xs_handle *xs_daemon_open_readonly(void);
 
-/* Close the connection to the xs daemon. */
+/* Close the connection to the xs daemon.
+ * Deprecated, please use xs_close() instead
+ */
 void xs_daemon_close(struct xs_handle *);
 
 /* Throw away the connection to the xs daemon, for use after fork(). */